﻿using Stateless;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace crip.Models
{
    public enum EventLevels
    {
        All,//全体可见
        Area,//区域可见
        Part,//部分可见
        Private//私人可见
    }
    /// <summary>
    /// 事件状态枚举
    /// </summary>
    public enum EventStatus
    {
        NotStarted,//尚未开始
        Ongoing, // 进行中
        completed//完成

    }
    /// <summary>
    /// 事件动作枚举
    /// </summary>
    public enum EventStateTriggerEnum
    { 
        Begin,//开始，
        End//结束
    }


    public class Event
    {
        public Event()
        {
            StateMachineInit();
        }
        //事件Id
        [Key]
        public Guid Id { get; set; }
        //事件名称（不可空）
        [Required]
        public string? EventName { get; set; }
        //事件描述（可空、最大长度为100）
        [MaxLength(100)]
        public string? EventDescription { get; set; }
        //事件级别(不可空)
        [Required]
        public EventLevels Level { get; set; }
        //事件详情（不可空）
        [Required]
        public string? EventDetail { get; set; }
        //图片（可空、图片外键）
        public ICollection<Picture> Pictures { get; set; } = new List<Picture>();
        //收集
        public ICollection<DataCollection> DataCollections = new List<DataCollection>();
        //区域Id
        [ForeignKey("AreaId")]
        public Guid AreaId { get; set; } 
        public Area Area { get; set; }
        [Required]
        public DateTime CreateTime { get; set; }
        public DateTime? StartTime { get; set; }
        public DateTime? EndTime { get; set; }
        //创建者Id
        public string CreateUserId { get; set; }

        public EventStatus State { get; set; }

        StateMachine<EventStatus, EventStateTriggerEnum> StateMachine;
        public void ReadyToBegin() //准备开始
        {
            StateMachine.Fire(EventStateTriggerEnum.Begin);
        }

        public void ComingtoEnd()//即将结束
        {
            StateMachine.Fire(EventStateTriggerEnum.End);
        }

       private void StateMachineInit()
    {
        StateMachine = new StateMachine<EventStatus, EventStateTriggerEnum>
        (() => State, s => State = s);
            StateMachine.Configure(EventStatus.NotStarted)//配置未开始
                .Permit(EventStateTriggerEnum.Begin, EventStatus.Ongoing);//前一个触发动作，后一个次状态
            StateMachine.Configure(EventStatus.Ongoing)//配置进行中
                .Permit(EventStateTriggerEnum.End, EventStatus.completed);//前一个触发动作，后一个次状态
     }

    }
 
}
